package _11_整理题目._8_多线程;

/**
 * 进程间通信的方式：
 *      消息队列、管道、共享内存、套接字、
 *
 * 线程知识必备：
 *      1、创建多线程的四种方法 对比：继承 Thread, 实现 Runnable, 通过 Callable 和 Future task 创建, 通过线程池
 *              四种方式分别是什么，怎么创建，有什么区别
 *                  1、是否有返回值：前两种没有，后两种需要 Future task 接收返回值
 *                  2、由于单继承机制，采用实现 Runnable 的方式，仍可以继承其他类
 *                  3、使用线程池的好处，采用池化的思想，避免频繁创建销毁线程，方便线程管理，线程复用，提高资源利用率
 *
 *      1.5 线程池的问题
 *          1、创建线程池的 7 个参数以及意义
 *          2、线程池的执行流程，原理
 *          3、什么时候执行拒绝策略，都有什么拒绝策略
 *
 *      2、线程的状态转化：new 新建 -> start 就绪 -> run 运行 -> sleep 阻塞 --> run完 或 error 结束
 *      3、常用的方法：
 *      4、控制线程同步的方法： 作用，使用，原理
 *              变量：volatile 修饰
 *              局部变量：使用 ThreadLocal
 *              原子变量：使用 AtomicInteger
 *
 *              线程方法：join wait notify sleep ，它们之间的区别
 *              同步方法：使用有 synchronized 关键字修饰的方法
 *              同步代码块：使用有 synchronized 关键字修饰的语句块
 *
 *              重入锁：使用 ReentrantLock
 *
 *              阻塞队列：BlockingQueue 的实现类： Array/Linked/Priority/BlockingQueue
 *
 *      thread.joint(n)     当前线程 等待 thread 线程实例执行完(或只等 n 毫秒) 再继续执行
 *      Thread.sleep(n)     可以让当前线程暂停 n 毫秒，后继续执行
 *
 *      5、synchronized 锁升级原理
 *          java 对象的 内存布局：
 *                  对象头(两个字的长度)
 *                      25 4 1 2 ：记录 对象运行时数据，哈希码、分代年龄、锁状态
 *                      class point ：指向这个对象的类，确认这个对象是哪个类的实例
 *                  实例数据(对象的属性字段信息)
 *                  数据填充(8字节的整数倍，cpu快速寻址)
 *          为什么需要锁升级：
 *                  jdk 6 之后有的 锁升级，之前 都是重量级锁，进一步提高并发的效率
 *                  例如：同一份代码，使用并发控制，但实际大多数时间只有一个线程执行，
 *                  那么频繁的获取锁，释放锁会造成很大的性能浪费
 *          锁的状态及升级原理：
 *                  首先四种状态是 无锁(01)，偏向锁(01)，轻量级锁(00)，重量级锁(10)
 *                  并且升级过程是单向的不可逆，为了提高获得锁和释放锁的效率
 *          锁升级的过程：
 *                  首先是无锁状态；
 *                  偏向锁是通过设置锁对象的对象头和栈帧中的锁记录 来存储锁偏向的线程ID
 *                  当它再次访问同步资源时，如果已经获得偏向锁则无需再进行同步设置
 *                  轻量级锁会使用 CAS 操作设置锁的同步
 *
 *          列举 jdk5 到 jdk6 的锁优化：
 *                  偏向锁，轻量级锁，  适应性自旋，  锁膨胀，锁消除
 *
 *                  偏向锁，轻量级锁，是为了解决xxx问题
 *
 *                  自旋：前一个线程持有锁的时间可能很短，如果很短的话，当前线程没必要挂起
 *
 * https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/multi-thread/synchronized%E5%9C%A8JDK1.6%E4%B9%8B%E5%90%8E%E7%9A%84%E5%BA%95%E5%B1%82%E4%BC%98%E5%8C%96.md
 *
 *      6、乐观锁和悲观锁的区别
 *
 *      AQS（Abstract Queued Synchronizer）是一个抽象的队列同步器，通过维护一个共享资源状态
 *      （Volatile Int State）和一个先进先出（FIFO）的线程等待队列来实现的多线程访问共享资源的同步框架。
 *      AQS 的基本原理
 *      AQS为每个共享资源都设置一个共享资源锁，线程在需要访问共享资源时首先需要获取共享资源锁，
 *      如果获取到了共享资源锁，便可以在当前线程中使用该共享资源，如果获取不到，则将该线程放入线程等待队列，等待下一次资源调度
 *      许多同步类的实现都依赖于AQS，例如常用的ReentrantLock、Semaphore和CountDownLatch。
 *
 */
public class _00_线程知识准备 {
}
